package Servidor;

import Comunicaciones.CorbaConexionServidor;
import PaqueteCORBA.AulaVirtualCORBAPOA;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import java.util.ArrayList;

public class AulaVirtual extends AulaVirtualCORBAPOA {

    @XStreamOmitField
    protected Comunicaciones.CorbaConexionServidor corbaConexionServidor;
    private ArrayList<Asignatura> _listaAsignaturas = new ArrayList<Asignatura>();
    ;
	private GestorExamen _gestorExamen;
    private ArrayList<Usuario> _listaUsuarios = new ArrayList<Usuario>();
    private ArrayList<Sesion> _listaSesiones = new ArrayList<Sesion>();
    static int COUNTER = 0;

    public AulaVirtual() {
    }

    public void arrancar(int puerto, String host) {
        if (_listaAsignaturas == null) {
            _listaAsignaturas = new ArrayList<Asignatura>();
        }

        if (_listaUsuarios == null) {
            _listaUsuarios = new ArrayList<Usuario>();
        }

        if (_listaSesiones == null) {
            _listaSesiones = new ArrayList<Sesion>();
        }

        corbaConexionServidor = new CorbaConexionServidor(puerto, host);
        // registrar el sirviente con el nombre del servidor
        corbaConexionServidor.registrarAulaVirtual(this, "AulaVirtual");
    }

    public Examen[] getExamenes() {
        Examen[] examenes;
        int numExamenes = 0;

        for (int i = 0; i < _listaAsignaturas.size(); i++) {
            Examen[] examenesAsignatura = _listaAsignaturas.get(i).getExamenes();

            numExamenes += examenesAsignatura.length;
        }

        examenes = new Examen[numExamenes];

        int index = 0;
        for (int i = 0; i < _listaAsignaturas.size(); i++) {
            Examen[] examenesAsignatura = _listaAsignaturas.get(i).getExamenes();

            for (int j = 0; j < examenesAsignatura.length; j++) {
                examenes[index++] = examenesAsignatura[j];
            }
        }

        return examenes;
    }

    public Usuario identificar(String aUser, String aPass) {
        for (int i = 0; i < _listaUsuarios.size(); i++) {
            if (_listaUsuarios.get(i).getUser().equals(aUser) && _listaUsuarios.get(i).getPass().equals(aPass)) {
                return _listaUsuarios.get(i);
            }
        }

        return null;
    }

    public void addSesion(Sesion aS) {
        _listaSesiones.add(aS);
    }

    public void deleteSesion(Sesion aSesion) {
        _listaSesiones.remove(aSesion);
    }

    /**
     *
     * @param aIdAsignatura
     * @return
     */
    public Asignatura findAsignatura(String aIdAsignatura) {
        for (int i = 0; i < _listaAsignaturas.size(); i++) {
            if (_listaAsignaturas.get(i).getNombre().equals(aIdAsignatura)) {
                return _listaAsignaturas.get(i);
            }
        }
        return null;
    }

    public Examen findExamen(String aIdExamen) {

        for (int i = 0; i < _listaAsignaturas.size(); i++) {
            if (_listaAsignaturas.get(i).findExamen(aIdExamen) != null) {
                return _listaAsignaturas.get(i).findExamen(aIdExamen);
            }

        }
        return null;
    }

    public ExamenEspecifico generarExamen(String aIdExamen, Alumno aA) throws Exception {
        Examen e = findExamen(aIdExamen);

        if (e == null) {
            throw new Exception("No existe ese examen");
        }
		
		if (aA.findExamen(aIdExamen) != null) {
			throw new Exception("Este examen se ha hecho una vez.");
		}

        //este método puede generar excepciones
        return e.generarExamen(aA);
    }

    public void guardarDatos() {
        //TODO: qué es esto?
        throw new UnsupportedOperationException();
    }

    @Override
    public String entrar() {
        String nameSesion = "Sesion" + Integer.toString(COUNTER++);
        Sesion sesion = new Sesion(this, nameSesion, corbaConexionServidor);

        addSesion(sesion);

        //El cliente empleará este nombre para obtener la referencia CORBA al objeto Sesion
        return nameSesion;
    }

    void addAsignatura(Asignatura a1) {
        _listaAsignaturas.add(a1);
    }

    void addUsuarios(Usuario p1) {
        _listaUsuarios.add(p1);
    }

    ArrayList<Asignatura> getAsignaturas() {
        return _listaAsignaturas;
    }
	
	public Usuario findUser(String idUser) {
		for (int i = 0; i < _listaUsuarios.size(); i++)
			if (_listaUsuarios.get(i).getNombre().equals(idUser))
				return _listaUsuarios.get(i);
		
		return null;
	}
}